Software applications are increasingly operating on large sets of data and themselves becoming increasingly complex. In some cases, distributed computing systems are used to support such applications (e.g., where a large database system distributes portions of data onto a landscape of different server nodes, and optimizes queries into sub-queries that get distributed across that landscape). Unfortunately, significant effort has to be spent managing that distribution both in terms of data placement and data access distribution methods, including the complexities of networking. If the landscape changes, if the data organization changes, or if the workload changes, significant work will be required. More generally, the behavior of complex computing systems changes over time, e.g., with new releases of applications, the addition of new intermediate software layers, new operating system releases, new processor models, changing structural characteristics of data, increasing amounts of data, and different data access patterns.